"use strict";

/**
 * 游戏主要逻辑脚本    --- 挂到渲染根节点 Canvas 上
 */

cc.Class({
  extends: cc.Component,

  properties: {
    // 这个属性引用了星星预制资源    --   功能可能类似于 import
    starPrefab: {
      default: null,
      type: cc.Prefab,
    },

    // 星星产生后消失时间的随机范围
    maxStarDuration: 0,
    minStarDuration: 0,

    // 地面节点，用于确定星星生成的高度
    ground: {
      default: null,
      type: cc.Node,
    },

    // Player 节点，用于获取主角弹跳的高度，和控制主角行动开关
    player: {
      default: null,
      type: cc.Node,
    },

    // 分数
    scoreDisplay: {
      default: null,
      type: cc.Label,
      displayName: "Score (player)", // 编辑器中的属性名
      tooltip: "得分", // 编辑器中的属性提示，类似 img 的 alt
    },

    // 音效
    scoreAudio: {
      default: null,
      type: cc.AudioClip,
    },

    // 引用按钮节点
    Button: {
      default: null,
      type: cc.Node,
    },
  },
  onLoad: function () {
    // 获取地平面的 y 轴坐标
    cc.log(this, "打印this看看");
    this.groundY = this.ground.y + this.ground.height / 2; // 不用let这种关键字，逻辑一个函数走不完

    // 初始化计时器
    this.timer = 0;
    this.starDuration = 0;

    // 调用函数 生成一个新的星星
    this.spawnNewStar();

    // 初始的得分设置为0
    this.score = 0;

    // 初始节点不显示
    this.Button.active = false;

    // 注册监听按钮事件
    this.Button.on(cc.Node.EventType.MOUSE_DOWN, this.onMousedown, this);
  },
  // 实例方法
  spawnNewStar: function () {
    // 使用给定的模板在场景中生成一个新节点
    var newStar = cc.instantiate(this.starPrefab);

    // 将新增的节点添加到 Canvas 节点下面
    this.node.addChild(newStar);

    // 为星星设置一个随机位置
    newStar.setPosition(this.getNewStarPosition());

    // 在星星脚本组件上保存 Game 对象的引用    把当前的实例对象保存在star脚本的game属性下面
    newStar.getComponent("Star").game = this;

    // 重置计时器，根据消失时间范围随机取一个值
    this.starDuration =
      this.minStarDuration +
      Math.random() * (this.maxStarDuration - this.minStarDuration);
    this.timer = 0;
  },

  getNewStarPosition: function () {
    var randX = 0;
    // 根据地平面位置和主角跳跃高度，随机得到一个星星的 y 坐标
    var randY =
      this.groundY +
      Math.random() * this.player.getComponent("Player").jumpHeight +
      50;
    // 根据屏幕宽度，随机得到一个星星 x 坐标
    var maxX = this.node.width / 2;
    randX = (Math.random() - 0.5) * 2 * maxX;
    // 返回星星坐标
    return cc.v2(randX, randY);
  },

  // 处理分数
  gainScore() {
    this.score += 1;
    // 更新 scoreDisplay Label 的文字
    this.scoreDisplay.string = "Score: " + this.score.toString();

    // 播放得分音效
    cc.audioEngine.playEffect(this.scoreAudio, false);
  },

  // 游戏失败
  gameOver: function () {
    // 停止 Player 节点的跳跃动作
    this.player.stopAllActions();

    // 显示按钮
    this.Button.active = true;
  },

  // 点击事件的回调
  onMousedown: function () {
    console.log("Mouse down");
    // 重新加载场景 game
    cc.director.loadScene("MainScene");
  },

  // 每帧更新计时器，超过限度还没有生成新的星星就会调用游戏失败逻辑
  update: function (dt) {
    if (this.timer > this.starDuration) {
      this.gameOver();
      return;
    }
    this.timer += dt;
  },
});
